// 该案例是一个使用互斥锁完成线程中一个公共变量的操作，并且输出当前数值的实例。
/***************************************************************************
 * 该代码中创建了两个线程，同时对全局变量x进行减一操作，并且输出当前的x数值，
 * 线程1和线程2对应的入口处理函数分别为threaddeal1和threaddeal2，其操作内容是相同的，
 * 首先调用pthread_mutex_lock函数对互斥量进行加锁操作，然后输出提示字符串，
 * 将全局变量进行减一操作，随后调用pthread_mutex_unlock函数去掉互斥量的锁，休眠1秒后退出
 * 直到全局变量的x等于0为止；主程序将x初始化为10，创建两个线程后阻塞等待线程，执行完成后退出。
 * */
//???不用初始化 互斥锁吗
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

// 定义全局变量：互斥锁的变量和全局变量x
pthread_mutex_t mutex;

int x;

void *threaddeal(void *rsg){
	
	while(x>0){
		// 在线程处理函数中调用加锁操作和解锁操作
		if(pthread_mutex_lock(&mutex) != 0){
			printf("互斥量加锁失败!\n");
			exit(0);
		}

		printf("线程%d正在运行:x = %d\n", (int *)rsg, x);

		pthread_mutex_unlock(&mutex);

		x--;

		sleep(1);
	}

	pthread_exit(NULL);
}

int main(){
	// 创建两个线程的标识符
	pthread_t pth1,pth2;

	int sta;
	x = 10;
	
	// 初始化互斥锁
	sta = pthread_mutex_init(&mutex,NULL);

	if(sta !=0 ){
		printf("互斥锁初始化失败!\n");
		exit(0);
	}
	
	// 创建两个线程
	sta = pthread_create(&pth1, NULL, threaddeal, (void *)1);
	
	if(sta != 0){
		printf("创建线程1失败!\n");
		exit(0);
	}

	sta = pthread_create(&pth2, NULL, threaddeal, (void *)2);

	if(sta !=0){
		printf("创建线程2失败!\n");
		exit(0);
	}


	// 阻塞线程，如果不阻塞线程则不会运行线程的处理函数
	pthread_join(pth1, NULL);
	pthread_join(pth2, NULL);
}




